#ifndef __MAIN_H__
#define __MAIN_H__ 1

#include <stdio.h>
#include <unistd.h>

extern FILE *g_logFileStream;
#define printk(string, ...) do { fprintf(g_logFileStream, "%s"string, getTimeString(), ##__VA_ARGS__); \
                                fprintf(stdout, "%s"string, getTimeString(), ##__VA_ARGS__); \
                                fflush(NULL); \
                            } while (0)
#define MAX_DATA_SIZE 1500  // 通信协议data成员的最大长度

enum {
    CD = 0x1000,
    LS = 0x1001,
    PWD = 0x1002,
    RM = 0x1003,
    MKDIR = 0x1004,
    PUTS = 0x1005,
    GETS = 0x1006,
    MESSAGE = 0x1007,  // 服务器回传给客户端的显示信息

    FILE_SIZE = 0x2001,  // 传输文件的大小
    FILE_DATA = 0x2002,  // 实际传输的文件内容
    FILE_MD5 = 0x2003,  // 文件的MD5值
    FILE_OFFSET = 0x2004,  // 文件偏移
    FILE_EXIST = 0x2005, // 文件已存在
    FILE_TRANS_START = 0x2006, // 可以传输文件

    USER_SIGNIN = 0x3000,  // 用户登录信息
    PASSWD_ERROR = 0x3001,  // 密码错误
    PASSWD_RIGHT = 0x3002  // 密码正确
};

/*
 * @brief 通信协议
 */
typedef struct {
    int type;  // 传输的数据类型
    int size;  // data的大小
    char data[];  // 实际使用的信息
} protocol_t;

static inline int getProtocolSize(const protocol_t *pProtocol) { return sizeof *pProtocol + pProtocol->size;   }
#define ERROR_CHECK(ret, val, msg) do { if (ret == val) { perror(msg); return -1;   }   } while(0)
char *getTimeString(void);

#endif